//=======================================Copyright(c)===========================================
// 								  深圳易马达科技有限公司
//---------------------------------------文件信息----------------------------------------------
//文件名		: Comm.c
//创建人		: Handry
//创建日期	:
//描述	    : 通信代码源文件
//-----------------------------------------------当前版本修订----------------------------------
//修改人		:
//版本	    :
//修改日期	:
//描述	    :
//=============================================================================================

//=============================================================================================
//包含头文件
//=============================================================================================
#include "Comm.h"

//=============================================================================================
//全局变量
//=============================================================================================
//=============================================================================================
//静态函数声明
//=============================================================================================

//=============================================================================================
//定义接口函数
//=============================================================================================

//=============================================================================================
//函数名称	: u16 CommUpdateCRC(u8 ch, u16 *pCrc)
//输入参数	: ch:输入的单个字符   pCrc：需要放置crc的数据指针
//输出参数	: void
//函数功能	: NFC通信更新CRC
//注意事项	:
//=============================================================================================
u16 CommUpdateCRC(u8 ch, u16 *pCrc)
{
	ch = (ch ^ (u8)((*pCrc) & 0x00FF));
	ch = (ch ^ (ch << 4));

	*pCrc = (*pCrc >> 8) ^ ((u16)ch << 8) ^ ((u16)ch << 3) ^ ((u16)ch >> 4);
	return(*pCrc);
}

//=============================================================================================
//函数名称	: u16 CommCalcCRC(int CRCType,u8 *Data, u16 Length,u8 *TransmitFirst, u8 *TransmitSecond)
//输入参数	: CRCType：CRC计算类型；Data：数组指针；Length：计算的长度；TransmitFirst：CRC低字节；TransmitSecond：CRC高字节
//输出参数	: CRC:计算的CRC
//函数功能	: NFC通信计算CRC
//注意事项	:
//=============================================================================================
u16 CommCalcCRC(int CRCType,u8 *Data, u16 Length,u8 *TransmitFirst, u8 *TransmitSecond)
{
	u8 chBlock;
	u16 wCrc;

	switch(CRCType)
	{
		// ITU-V.41	crc计算初值
		case COMM_CRC_A:
			wCrc = 0x6363;
		break;

		// ISO 3309	crc计算初值
		case COMM_CRC_B:
			wCrc = 0xFFFF;
		break;

		default:
		return 0;
	}

	do
	{
		chBlock = *Data++;
		CommUpdateCRC(chBlock, &wCrc);
	} while (--Length);

	if (COMM_CRC_B == CRCType)
	{
		wCrc = ~wCrc; // ISO 3309
	}

	if(0 != TransmitFirst)
	{
		*TransmitFirst = (u8) (wCrc & 0xFF);
	}

	if(0 != TransmitSecond)
	{
		*TransmitSecond = (u8) ((wCrc >> 8) & 0xFF);
	}

	return wCrc;
}

//=============================================================================================
//函数名称	: u8 CommCheckCRCA(u8 *msg, u8 cnt)
//输入参数	: msg：比较的数据指针；cnt：比较的数据的长度
//输出参数	: TRUE：CRC正确；FALSE：CRC错误
//函数功能	: NFC通信检测CRC A方式是否正确
//注意事项	:
//=============================================================================================
u8 CommCheckCRCA(u8 *msg, u8 cnt)
{
    u8 crc1,crc2;

    CommCalcCRC(COMM_CRC_A , msg, cnt, &crc1, &crc2);
    if((crc1 != msg[cnt]) || (crc2 != msg[cnt+1]))
    {
        return FALSE;
    }
    return TRUE;
}

//=============================================================================================
//函数名称	: void StringCopy(u8 *dest, const u8 *sour, u16 cnt);
//输入参数	: dest：目标字符串地址； *sour：源字符串地址；cnt：复制的长度
//输出参数	:
//函数功能	: 字符串复制
//注意事项	:
//=============================================================================================
void StringCopy(u8 *dest, const u8 *sour, u16 cnt)
{
    while(0 < (cnt--))
    {
       *(dest++) = *(sour++);
    }
}

//=============================================================================================
//函数名称	: void ChangeU32ToChar(u8 * des , u32 dat)
//输入参数	: des：目标字符串地址；dat：源32位数据
//输出参数	:
//函数功能	: 32位数据转化为字符串，用于打印
//注意事项	:
//=============================================================================================
void ChangeU32ToChar(u8 * des , u32 dat)
{
    s32 i;
    u8 c;
    for(i = 28;i >= 0;i -= 4)
    {
        c = ((dat >> i)&0xf);
        
        if(c < 0x0a)
        {
            *des++ = '0' + c;
        }
        else
        {
            *des++ = 'A'-0xa + c;
        }
    }
}

//=============================================================================================
//函数名称	: void ChangeU8ToCharString(u8 * des , u8 const *dat , u8 num)
//输入参数	: des：目标字符串地址；*dat：源字符串地址；num：转换的长度
//输出参数	:
//函数功能	: 将8位数组数据转化为字符串，用于打印
//注意事项	:
//=============================================================================================
void ChangeU8ToCharString(u8 * des , u8 const *dat , u8 num)
{
    s32 i;
    u8 c;
    while(num--)
    {
        for(i = 4;i >= 0;i -= 4)
        {
            c = ((*dat >> i)&0xf);
            if(c < 0x0a)
            {
                *des++ = '0' + c;
            }
            else
            {
                *des++ = 'A'-0xa + c;
            }
        }
        if(num != 1)
            *des++ = ' ';
    }
}

/*****************************************end of Comm.c*****************************************/
